home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / FrodoV1_5.lha / src / 6526.asm < prev    next >
Assembly Source File  |  1995-05-12  |  25KB  |  1,356 lines

  1. *
  2. * 6526.asm - CIA-Emulation
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise/Periodic:
  12. *  - Für jede (simulierte) C64-Rasterzeile wird vom 6510-Task die Routine
  13. *    Periodic6526 aufgerufen, die die Timer herunterzählt, ggf. Interrupts
  14. *    auslöst und die Joysticks abfragt
  15. *
  16. * Timer/Latches:
  17. *  - Die Bytefolge im Register-File ist gegenüber dem echten 6526 umgekehrt,
  18. *    das wird aber bei den WriteTo6526- und ReadFrom6526-Routinen wieder
  19. *    ausgeglichen
  20. *
  21. * TOD-Clocks:
  22. *  - Die TODs werden synchron mit dem VBlank gezählt. Es wird also ein
  23. *    50Hz-Eingangssignal simuliert.
  24. *
  25. * Tastaturabfrage:
  26. *  - Das Feld KeyMatrix enthält für jede Taste entsprechend der C64-
  27. *    Tastaturmatrix ein Bit (0: Taste gedrückt, 1: Taste nicht gedrückt)
  28. *  - Bei Lesezugriffen aus CIA-A, Port B werden entsprechend der aktiven
  29. *    (ausgewählten) Zeilen der Tastatur die entsprechenden Bits aus der
  30. *    Tastaturmatrix zusammengestellt
  31. *  - Die Help-Taste löst einen NMI aus (Restore), F10 einen RESET,
  32. *    über F9 wird das Einstellungs-Fenster aufgerufen
  33. *
  34. * Inkompatibilitäten:
  35. *  - Die TOD-Clock sollte bei einem Lesezugriff nicht angehalten,
  36. *    sondern gelatcht werden
  37. *
  38.  
  39.         MACHINE    68020
  40.  
  41.         XREF    ShowPrefs    ;Main.asm
  42.  
  43.         XREF    _ciaaprb
  44.         XREF    _ciaaddrb
  45.  
  46.         XREF    IntIsRESET    ;6510.asm
  47.         XREF    IntIsNMI
  48.         XREF    IntIsCIAIRQ
  49.         XREF    Peri6526Cont
  50.  
  51.         XREF    ChangedVA    ;6569.asm
  52.  
  53.         XREF    Reset6581    ;6581.asm
  54.  
  55.         XREF    IECIsOpen    ;1541.asm
  56.  
  57.         XDEF    Reset6526
  58.         XDEF    ReadFrom6526A
  59.         XDEF    ReadFrom6526B
  60.         XDEF    WriteTo6526A
  61.         XDEF    WriteTo6526B
  62.         XDEF    Periodic6526
  63.         XDEF    ChangedKeys
  64.         XDEF    CountTODs
  65.         XDEF    KeyPressed
  66.  
  67.         XDEF    CIACycles    ;Prefs
  68.         XDEF    Joystick1On
  69.         XDEF    Joystick2On
  70.         XDEF    JoystickSwap
  71.         XDEF    KeyboardYZ
  72.  
  73.         SECTION    "CODE",CODE
  74.  
  75. **
  76. ** Definitionen
  77. **
  78.  
  79. ; CIA-Register
  80. PRA        = 0
  81. PRB        = 1
  82. DDRA        = 2
  83. DDRB        = 3
  84. TAHI        = 4    ;Timer-Wert A
  85. TALO        = 5    ;Achtung: Umgekehrte Bytefolge!
  86. TBHI        = 6    ;Timer-Wert B
  87. TBLO        = 7
  88. TOD10THS    = 8
  89. TODSEC        = 9
  90. TODMIN        = 10
  91. TODHR        = 11
  92. SDR        = 12
  93. ICR        = 13    ;Interrupt-Data
  94. CRA        = 14
  95. CRB        = 15
  96.  
  97. ; Zusätzliche Register
  98. LTCHA        = 16    ;Timer-Latch A
  99. LTCHB        = 18    ;Timer-Latch B
  100. INTMASK        = 20    ;Interrupt-Enable
  101. TODHALT        = 21    ;TOD zwecks Beschreiben/Auslesen gestoppt
  102. ALM10THS    = 22    ;Alarmzeit
  103. ALMSEC        = 23
  104. ALMMIN        = 24
  105. ALMHR        = 25
  106. TODDIV        = 26    ;TOD-Frequenzteiler
  107. TACNTPHI2    = 27    ;Timer A läuft und zählt Phi2
  108. TBCNTPHI2    = 28    ;Timer B läuft und zählt Phi2
  109. TBCNTTA        = 29    ;Timer B läuft und zählt Unterläufe von Timer A
  110.  
  111.  
  112. **
  113. ** CIAs zurücksetzen
  114. **
  115.  
  116. ; CIA-A
  117. Reset6526    lea    Registers1,a0
  118.         clr.l    (a0)
  119.         clr.l    4(a0)
  120.         clr.l    8(a0)
  121.         clr.l    12(a0)
  122.         move.w    #-1,TAHI(a0)        ;Timer auf -1
  123.         move.w    #-1,TBHI(a0)
  124.  
  125.         move.w    #$0001,LTCHA(a0)    ;Latches auf 1
  126.         move.w    #$0001,LTCHB(a0)
  127.         clr.b    INTMASK(a0)        ;Interrupts abschalten
  128.         clr.b    TODHALT(a0)        ;TOD läuft
  129.         clr.l    ALM10THS(a0)        ;Alarmzeit auf 00:00:00.0
  130.         clr.w    TACNTPHI2(a0)        ;Beide Timer anhalten
  131.  
  132.         move.b    #$ff,Joystick1        ;Joystick inaktiv
  133.         move.b    #$ff,Joystick2
  134.         move.b    #$ff,Joystick2Key
  135.  
  136. ; CIA-B
  137.         lea    Registers2,a0
  138.         clr.l    (a0)
  139.         clr.l    4(a0)
  140.         clr.l    8(a0)
  141.         clr.l    12(a0)
  142.         move.w    #-1,TAHI(a0)        ;Timer auf -1
  143.         move.w    #-1,TBHI(a0)
  144.  
  145.         move.w    #$0001,LTCHA(a0)    ;Latches auf 1
  146.         move.w    #$0001,LTCHB(a0)
  147.         clr.b    INTMASK(a0)        ;Interrupts abschalten
  148.         clr.b    TODHALT(a0)        ;TOD läuft
  149.         clr.l    ALM10THS(a0)        ;Alarmzeit auf 00:00:00.0
  150.         clr.w    TACNTPHI2(a0)        ;Beide Timer anhalten
  151.  
  152. ; Tastaturmatrix löschen
  153.         moveq    #-1,d0
  154.         move.l    d0,KeyMatrix
  155.         move.l    d0,KeyMatrix+4
  156.  
  157. ; VIC-Bank 0 einstellen
  158.         moveq    #0,d0
  159.         bra    ChangedVA
  160.  
  161.  
  162. **
  163. ** Tastaturbelegung geändert, Y und Z sortieren
  164. **
  165.  
  166. ChangedKeys    tst.w    KeyboardYZ
  167.         bne    1$
  168.         move.l    #$00010004,KeyPatch1
  169.         move.l    #$00030001,KeyPatch2
  170.         rts
  171. 1$        move.l    #$00030001,KeyPatch1
  172.         move.l    #$00010004,KeyPatch2
  173.         rts
  174.  
  175.  
  176. **
  177. ** In ein CIA-A-Register schreiben
  178. ** d0.w: Registernummer ($00-$0f)
  179. ** d1.b: Byte
  180. **
  181. ** Darf das obere Wort von d0 und d1 nicht verändern!
  182. **
  183.  
  184. WriteTo6526A    lea    Registers1,a0
  185.         move.l    WriteTabA(pc,d0.w*4),a1
  186.         jmp    (a1)
  187.  
  188.         CNOP    0,4
  189. WriteTabA    dc.l    WrNormal
  190.         dc.l    WrNormal
  191.         dc.l    WrNormal
  192.         dc.l    WrNormal
  193.         dc.l    WrTALO
  194.         dc.l    WrTAHI
  195.         dc.l    WrTBLO
  196.         dc.l    WrTBHI
  197.         dc.l    WrTOD10THS
  198.         dc.l    WrTODSEC
  199.         dc.l    WrTODMIN
  200.         dc.l    WrTODHR
  201.         dc.l    WrNormal
  202.         dc.l    WrICR
  203.         dc.l    WrCRA
  204.         dc.l    WrCRB
  205.  
  206. WrNormal    move.b    d1,(a0,d0.w)
  207.         rts
  208.  
  209. WrTALO        move.b    d1,LTCHA+1(a0)
  210.         rts
  211.  
  212. WrTAHI        move.b    d1,LTCHA(a0)
  213.         btst    #0,CRA(a0)        ;Timer A gestoppt?
  214.         bne    1$
  215.         move.w    LTCHA(a0),TAHI(a0)    ;Ja, Timer laden
  216. 1$        rts
  217.  
  218. WrTBLO        move.b    d1,LTCHB+1(a0)
  219.         rts
  220.  
  221. WrTBHI        move.b    d1,LTCHB(a0)
  222.         btst    #0,CRB(a0)        ;Timer B gestoppt?
  223.         bne    1$
  224.         move.w    LTCHB(a0),TBHI(a0)    ;Ja, Timer laden
  225. 1$        rts
  226.  
  227. WrTOD10THS    and.b    #$0f,d1
  228.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  229.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  230.         bne    1$
  231.         move.b    d1,TOD10THS(a0)
  232.         rts
  233. 1$        move.b    d1,ALM10THS(a0)
  234.         rts
  235.  
  236. WrTODSEC    and.b    #$7f,d1
  237.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  238.         bne    1$
  239.         move.b    d1,TODSEC(a0)
  240.         rts
  241. 1$        move.b    d1,ALMSEC(a0)
  242.         rts
  243.  
  244. WrTODMIN    and.b    #$7f,d1
  245.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  246.         bne    1$
  247.         move.b    d1,TODMIN(a0)
  248.         rts
  249. 1$        move.b    d1,ALMMIN(a0)
  250.         rts
  251.  
  252. WrTODHR        and.b    #$9f,d1
  253.         st.b    TODHALT(a0)    ;TOD anhalten
  254.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  255.         bne    1$
  256.         move.b    d1,TODHR(a0)
  257.         rts
  258. 1$        move.b    d1,ALMHR(a0)
  259.         rts
  260.  
  261. WrICR        bclr    #7,d1            ;S/C-Bit löschen
  262.         bne    1$            ;War es gesetzt?
  263.         not.b    d1            ;Nein, Bits zum Löschen negieren
  264.         and.b    d1,INTMASK(a0)        ;Und Bits löschen
  265.         bra    2$
  266. 1$        or.b    d1,INTMASK(a0)        ;Bits setzen
  267. 2$        rts
  268.  
  269. WrCRA        btst    #4,d1            ;Force load?
  270.         beq    1$
  271.         and.b    #$ef,d1
  272.         move.w    LTCHA(a0),TAHI(a0)    ;Ja, Timer laden
  273. 1$        move.b    d1,CRA(a0)
  274.  
  275.         and.b    #$21,d1            ;Läuft der Timer und zählt er Phi2?
  276.         cmp.b    #$01,d1
  277.         seq.b    TACNTPHI2(a0)        ;Ja, Flag setzen
  278.         rts
  279.  
  280. WrCRB        btst    #4,d1            ;Force load?
  281.         beq    1$
  282.         and.b    #$ef,d1
  283.         move.w    LTCHB(a0),TBHI(a0)    ;Ja, Timer laden
  284. 1$        move.b    d1,CRB(a0)
  285.  
  286.         and.b    #$61,d1            ;Läuft der Timer und zählt er Phi2?
  287.         cmp.b    #$01,d1
  288.         seq.b    TBCNTPHI2(a0)        ;Ja, Flag setzen
  289.         cmp.b    #$41,d1            ;Läuft er und zählt Unterläuft von Timer A?
  290.         seq.b    TBCNTTA(a0)        ;Ja, Flag setzen
  291.         rts
  292.  
  293.  
  294. **
  295. ** In ein CIA-B-Register schreiben
  296. ** d0.w: Registernummer ($00-$0f)
  297. ** d1.b: Byte
  298. **
  299. ** Darf das obere Wort von d0 und d1 nicht verändern!
  300. **
  301.  
  302. WriteTo6526B    lea    Registers2,a0
  303.         move.l    WriteTabB(pc,d0.w*4),a1
  304.         jmp    (a1)
  305.  
  306.         CNOP    0,4
  307. WriteTabB    dc.l    WrBPRA
  308.         dc.l    WrNormal
  309.         dc.l    WrBDDRA
  310.         dc.l    WrNormal
  311.         dc.l    WrTALO
  312.         dc.l    WrTAHI
  313.         dc.l    WrTBLO
  314.         dc.l    WrTBHI
  315.         dc.l    WrTOD10THS
  316.         dc.l    WrTODSEC
  317.         dc.l    WrTODMIN
  318.         dc.l    WrTODHR
  319.         dc.l    WrNormal
  320.         dc.l    WrICR
  321.         dc.l    WrCRA
  322.         dc.l    WrCRB
  323.  
  324. WrBPRA        move.b    d1,PRA(a0)        ;Floppy/VA
  325.         tst.b    IECIsOpen        ;Wenn IEC aktiv ist, Port setzen
  326.         beq    WrBNewVA
  327.         move.b    d1,_ciaaprb
  328.         bra    WrBNewVA
  329.  
  330. WrBDDRA        move.b    d1,DDRA(a0)        ;Floppy/VA
  331.         tst.b    IECIsOpen        ;Wenn IEC aktiv ist, DDR setzen
  332.         beq    WrBNewVA
  333.         move.b    d1,_ciaaddrb
  334. WrBNewVA    move.b    DDRA(a0),d0        ;VA extrahieren
  335.         not.b    d0
  336.         or.b    PRA(a0),d0
  337.         not.b    d0
  338.         and.b    #$03,d0
  339.         bra    ChangedVA        ;Und dem VIC mitteilen
  340.  
  341.  
  342. **
  343. ** Aus einem CIA-A-Register lesen
  344. ** d0.w: Registernummer ($00-$0f)
  345. ** Rückgabe: d0.b: Byte
  346. **
  347. ** Darf das obere Wort von d0 und d1 nicht verändern!
  348. ** Darf a1 nicht verändern!
  349. **
  350.  
  351. ReadFrom6526A    move.l    ReadTabA(pc,d0.w*4),a0
  352.         jmp    (a0)
  353.  
  354.         CNOP    0,4
  355. ReadTabA    dc.l    RdAPRA
  356.         dc.l    RdAPRB
  357.         dc.l    RdANormal
  358.         dc.l    RdANormal
  359.         dc.l    RdATALO
  360.         dc.l    RdATAHI
  361.         dc.l    RdATBLO
  362.         dc.l    RdATBHI
  363.         dc.l    RdATOD10THS
  364.         dc.l    RdANormal
  365.         dc.l    RdANormal
  366.         dc.l    RdATODHR
  367.         dc.l    RdANormal
  368.         dc.l    RdAICR
  369.         dc.l    RdANormal
  370.         dc.l    RdANormal
  371.  
  372. RdANormal    lea    Registers1,a0
  373.         move.b    (a0,d0.w),d0
  374.         rts
  375.  
  376. RdAPRA        lea    Registers1,a0
  377.         move.b    DDRA(a0),d0
  378.         not.b    d0
  379.         or.b    PRA(a0),d0
  380.         and.b    Joystick2,d0
  381.         rts
  382.  
  383. RdAPRB        move.l    a1,-(sp)
  384.         lea    Registers1,a0
  385.         lea    KeyMatrix,a1
  386.         move.b    PRA(a0),d1    ;Tastaturabfrage
  387.         move.b    #$ff,d0        ;Alle aktiven Reihen dazuANDen
  388.         lsr.b    #1,d1
  389.         bcs    1$
  390.         and.b    (a1),d0
  391. 1$        lsr.b    #1,d1
  392.         bcs    2$
  393.         and.b    1(a1),d0
  394. 2$        lsr.b    #1,d1
  395.         bcs    3$
  396.         and.b    2(a1),d0
  397. 3$        lsr.b    #1,d1
  398.         bcs    4$
  399.         and.b    3(a1),d0
  400. 4$        lsr.b    #1,d1
  401.         bcs    5$
  402.         and.b    4(a1),d0
  403. 5$        lsr.b    #1,d1
  404.         bcs    6$
  405.         and.b    5(a1),d0
  406. 6$        lsr.b    #1,d1
  407.         bcs    7$
  408.         and.b    6(a1),d0
  409. 7$        lsr.b    #1,d1
  410.         bcs    8$
  411.         and.b    7(a1),d0
  412.  
  413. 8$        and.b    Joystick1,d0
  414.         move.b    DDRB(a0),d1
  415.         not.b    d1
  416.         or.b    PRB(a0),d1
  417.         and.b    d1,d0
  418.         move.l    (sp)+,a1
  419.         rts
  420.  
  421. RdATALO        move.b    Registers1+TALO,d0    ;Weil die Timer im Registerfile
  422.         rts                ;als big-endian gespeichert sind
  423.  
  424. RdATAHI        move.b    Registers1+TAHI,d0
  425.         rts
  426.  
  427. RdATBLO        move.b    Registers1+TBLO,d0
  428.         rts
  429.  
  430. RdATBHI        move.b    Registers1+TBHI,d0
  431.         rts
  432.  
  433. RdATOD10THS    lea    Registers1,a0
  434.         move.b    TOD10THS(a0),d0
  435.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  436.         rts
  437.  
  438. RdATODHR    lea    Registers1,a0
  439.         st.b    TODHALT(a0)    ;TOD anhalten
  440.         move.b    TODHR(a0),d0
  441.         rts
  442.  
  443. RdAICR        lea    Registers1,a0
  444.         move.b    ICR(a0),d0    ;ICR beim Lesen löschen
  445.         clr.b    ICR(a0)
  446.         clr.b    IntIsCIAIRQ    ;IRQ zurücknehmen
  447.         rts
  448.  
  449.  
  450. **
  451. ** Aus einem CIA-B-Register lesen
  452. ** d0.w: Registernummer ($00-$0f)
  453. ** Rückgabe: d0.b: Byte
  454. **
  455. ** Darf das obere Wort von d0 und d1 nicht verändern!
  456. ** Darf a1 nicht verändern!
  457. **
  458.  
  459. ReadFrom6526B    move.l    ReadTabB(pc,d0.w*4),a0
  460.         jmp    (a0)
  461.  
  462.         CNOP    0,4
  463. ReadTabB    dc.l    RdBPRA
  464.         dc.l    RdBPRB
  465.         dc.l    RdBNormal
  466.         dc.l    RdBNormal
  467.         dc.l    RdBTALO
  468.         dc.l    RdBTAHI
  469.         dc.l    RdBTBLO
  470.         dc.l    RdBTBHI
  471.         dc.l    RdBTOD10THS
  472.         dc.l    RdBNormal
  473.         dc.l    RdBNormal
  474.         dc.l    RdBTODHR
  475.         dc.l    RdBNormal
  476.         dc.l    RdBICR
  477.         dc.l    RdBNormal
  478.         dc.l    RdBNormal
  479.  
  480. RdBNormal    lea    Registers2,a0
  481.         move.b    (a0,d0.w),d0
  482.         rts
  483.  
  484. RdBPRA        lea    Registers2,a0
  485.         move.b    DDRA(a0),d0    ;Floppy/VA
  486.         not.b    d0
  487.         or.b    PRA(a0),d0
  488.  
  489.         tst.b    IECIsOpen    ;Wenn IEC aktiv ist, davon lesen
  490.         beq    1$
  491.         and.b    #$03,d0
  492.         move.b    _ciaaprb,d1
  493.         and.b    #$fc,d1
  494.         or.b    d1,d0
  495. 1$        rts
  496.  
  497. RdBPRB        lea    Registers2,a0
  498.         move.b    DDRB(a0),d0    ;Userport
  499.         not.b    d0        ;Eingabebits immer 1
  500.         or.b    PRB(a0),d0
  501.         rts
  502.  
  503. RdBTALO        move.b    Registers2+TALO,d0    ;Weil die Timer im Registerfile
  504.         rts                ;als big-endian gespeichert sind
  505.  
  506. RdBTAHI        move.b    Registers2+TAHI,d0
  507.         rts
  508.  
  509. RdBTBLO        move.b    Registers2+TBLO,d0
  510.         rts
  511.  
  512. RdBTBHI        move.b    Registers2+TBHI,d0
  513.         rts
  514.  
  515. RdBTOD10THS    lea    Registers2,a0
  516.         move.b    TOD10THS(a0),d0
  517.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  518.         rts
  519.  
  520. RdBTODHR    lea    Registers2,a0
  521.         st.b    TODHALT(a0)    ;TOD anhalten
  522.         move.b    TODHR(a0),d0
  523.         rts
  524.  
  525. RdBICR        lea    Registers2,a0
  526.         move.b    ICR(a0),d0    ;ICR beim Lesen löschen
  527.         clr.b    ICR(a0)
  528.         rts
  529.  
  530.  
  531. **
  532. ** Wird jede Rasterzeile einmal aufgerufen
  533. **
  534.  
  535. *
  536. * CIA-A
  537. * d1: ICR
  538. * d2: INTMASK
  539. * d3: CIACycles
  540. *
  541.  
  542. Periodic6526    lea    Registers1,a0
  543.         move.b    ICR(a0),d1
  544.         move.b    INTMASK(a0),d2
  545.         move.w    CIACycles,d3
  546.  
  547. *
  548. * Timer A
  549. *
  550.  
  551.         tst.b    TACNTPHI2(a0)    ;Wird Phi2 gezählt?
  552.         beq    CiaATADone
  553.  
  554.         sub.w    d3,TAHI(a0)    ;Ja, herabzählen
  555.         bcc    CiaATADone    ;Unterlauf?
  556.  
  557.         or.b    #$01,d1        ;Ja, IRQ-Bit setzen
  558.         btst    #0,d2        ;IRQ freigegeben?
  559.         beq    CiaATANoIRQ
  560.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  561.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  562.  
  563. CiaATANoIRQ    move.w    LTCHA(a0),TAHI(a0) ;Zähler neu laden
  564.         btst    #3,CRA(a0)    ;One-Shot?
  565.         beq    1$
  566.         and.b    #$fe,CRA(a0)    ;Ja, Zähler stoppen
  567.         clr.b    TACNTPHI2(a0)
  568.  
  569. 1$        tst.b    TBCNTTA(a0)    ;Läuft Timer B und zählt er
  570.         beq    CiaATADone    ; Unterläufe von Timer A?
  571.  
  572.         subq.w    #1,TBHI(a0)    ;Ja, Timer B runterzählen
  573.         bcs    CiaATBUnderflow    ;Untergelaufen?
  574. CiaATADone
  575.  
  576. *
  577. * Timer B
  578. *
  579.  
  580.         tst.b    TBCNTPHI2(a0)    ;Wird Phi2 gezählt?
  581.         beq    CiaATBDone
  582.  
  583.         sub.w    d3,TBHI(a0)    ;Ja, herabzählen
  584.         bcc    CiaATBDone    ;Unterlauf?
  585.  
  586. CiaATBUnderflow    or.b    #$02,d1        ;Ja, IRQ-Bit setzen
  587.         btst    #1,d2        ;IRQ freigegeben?
  588.         beq    CiaATBNoIRQ
  589.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  590.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  591.  
  592. CiaATBNoIRQ    move.w    LTCHB(a0),TBHI(a0) ;Zähler neu laden
  593.         btst    #3,CRB(a0)    ;One-Shot?
  594.         beq    CiaATBDone
  595.         and.b    #$fe,CRB(a0)    ;Ja, Zähler stoppen
  596.         clr.b    TBCNTPHI2(a0)
  597.         clr.b    TBCNTTA(a0)
  598. CiaATBDone
  599.  
  600. *
  601. * ICR zurückschreiben
  602. *
  603.  
  604.         move.b    d1,ICR(a0)
  605.  
  606. *
  607. * CIA-B
  608. * d1: ICR
  609. * d2: INTMASK
  610. * d3: CIACycles
  611. *
  612.  
  613.         lea    Registers2,a0
  614.         move.b    ICR(a0),d1
  615.         move.b    INTMASK(a0),d2
  616.  
  617. *
  618. * Timer A
  619. *
  620.  
  621.         tst.b    TACNTPHI2(a0)    ;Wird Phi2 gezählt?
  622.         beq    CiaBTADone
  623.  
  624.         sub.w    d3,TAHI(a0)    ;Ja, herabzählen
  625.         bcc    CiaBTADone    ;Unterlauf?
  626.  
  627.         or.b    #$01,d1        ;Ja, IRQ-Bit setzen
  628.         btst    #0,d2        ;IRQ freigegeben?
  629.         beq    CiaBTANoIRQ
  630.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  631.         st.b    IntIsNMI    ;und NMI auslösen
  632.  
  633. CiaBTANoIRQ    move.w    LTCHA(a0),TAHI(a0) ;Zähler neu laden
  634.         btst    #3,CRA(a0)    ;One-Shot?
  635.         beq    1$
  636.         and.b    #$fe,CRA(a0)    ;Ja, Zähler stoppen
  637.         clr.b    TACNTPHI2(a0)
  638.  
  639. 1$        tst.b    TBCNTTA(a0)    ;Läuft Timer B und zählt er
  640.         beq    CiaBTADone    ; Unterläufe von Timer A?
  641.  
  642.         subq.w    #1,TBHI(a0)    ;Ja, Timer B runterzählen
  643.         bcs    CiaBTBUnderflow    ;Untergelaufen?
  644. CiaBTADone
  645.  
  646. *
  647. * Timer B
  648. *
  649.  
  650.         tst.b    TBCNTPHI2(a0)    ;Wird Phi2 gezählt?
  651.         beq    CiaBTBDone
  652.  
  653.         sub.w    d3,TBHI(a0)    ;Ja, herabzählen
  654.         bcc    CiaBTBDone    ;Unterlauf?
  655.  
  656. CiaBTBUnderflow    or.b    #$02,d1        ;Ja, IRQ-Bit setzen
  657.         btst    #1,d2        ;IRQ freigegeben?
  658.         beq    CiaBTBNoIRQ
  659.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  660.         st.b    IntIsNMI    ;und NMI auslösen
  661.  
  662. CiaBTBNoIRQ    move.w    LTCHB(a0),TBHI(a0) ;Zähler neu laden
  663.         btst    #3,CRB(a0)    ;One-Shot?
  664.         beq    CiaBTBDone
  665.         and.b    #$fe,CRB(a0)    ;Ja, Zähler stoppen
  666.         clr.b    TBCNTPHI2(a0)
  667.         clr.b    TBCNTTA(a0)
  668. CiaBTBDone
  669.  
  670. *
  671. * ICR zurückschreiben
  672. *
  673.  
  674.         move.b    d1,ICR(a0)
  675.  
  676. ; In 6510-Task zurückspringen
  677.         bra    Peri6526Cont
  678.  
  679.  
  680. **
  681. ** TODs zählen
  682. **
  683.  
  684. *
  685. * CIA-A
  686. *
  687.  
  688. CountTODs    lea    Registers1,a0
  689.         subq.b    #1,TODDIV(a0)    ;Frequenzteiler herabzählen
  690.         bpl    CiaATODNop
  691.  
  692.         btst    #7,CRA(a0)    ;Untergelaufen,
  693.         beq    CiaATOD60Hz    ; je nach 50/60Hz-Flag neu laden
  694.         move.b    #4,TODDIV(a0)
  695.         bra    CiaATODLoaded
  696. CiaATOD60Hz    move.b    #5,TODDIV(a0)
  697.  
  698. CiaATODLoaded    move    #0,ccr        ;X löschen
  699.         move.b    #1,d0        ;1/10 Sekunden erhöhen
  700.         move.b    TOD10THS(a0),d1
  701.         abcd    d0,d1
  702.         move.b    d1,TOD10THS(a0)
  703.         cmp.b    #$10,d1        ;Über 10?
  704.         blo    CiaATODDone
  705.  
  706.         clr.b    TOD10THS(a0)    ;Ja, 1/10 Sekunden auf Null setzen
  707.         move    #0,ccr        ;und Sekunden erhöhen
  708.         move.b    #1,d0
  709.         move.b    TODSEC(a0),d1
  710.         abcd    d0,d1
  711.         move.b    d1,TODSEC(a0)
  712.         cmp.b    #$60,d1        ;Über 60?
  713.         blo    CiaATODDone
  714.  
  715.         clr.b    TODSEC(a0)    ;Ja, Sekunden auf Null setzen
  716.         move    #0,ccr        ;und Minuten erhöhen
  717.         move.b    #1,d0
  718.         move.b    TODMIN(a0),d1
  719.         abcd    d0,d1
  720.         move.b    d1,TODMIN(a0)
  721.         cmp.b    #$60,d1        ;Über 60?
  722.         blo    CiaATODDone
  723.  
  724.         clr.b    TODMIN(a0)    ;Ja, Minuten auf Null setzen
  725.         move    #0,ccr        ;und Stunden erhöhen
  726.         move.b    #1,d0
  727.         move.b    TODHR(a0),d1
  728.         and.b    #$1f,d1        ;AM/PM ausmaskieren
  729.         abcd    d0,d1
  730.         and.b    #$80,TODHR(a0)    ;Stunden schreiben, AM/PM lassen
  731.         or.b    d1,TODHR(a0)
  732.  
  733.         cmp.b    #$12,d1        ;Über 12?
  734.         blo    CiaATODDone
  735.  
  736.         and.b    #$1f,TODHR(a0)    ;Ja, Stunden auf Null setzen
  737.         eor.b    #$80,TODHR(a0)    ;und AM/PM umdrehen
  738.  
  739. CiaATODDone    move.l    TOD10THS(a0),d0    ;Alarmzeit erreicht?
  740.         cmp.l    ALM10THS(a0),d0
  741.         bne    CiaATODNop
  742.         move.b    ICR(a0),d0    ;Ja, IRQ-Bit setzen
  743.         or.b    #$04,d0
  744.         btst    #2,INTMASK(a0)    ;IRQ freigegeben?
  745.         beq    CiaATODNoIRQ
  746.         or.b    #$80,d0        ;Ja, IR-Bit setzen
  747.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  748. CiaATODNoIRQ    move.b    d0,ICR(a0)
  749. CiaATODNop
  750.  
  751. *
  752. * CIA-B
  753. *
  754.  
  755.         lea    Registers2,a0
  756.         subq.b    #1,TODDIV(a0)    ;Frequenzteiler herabzählen
  757.         bpl    CiaBTODNop
  758.  
  759.         btst    #7,CRA(a0)    ;Untergelaufen,
  760.         beq    CiaBTOD60Hz    ; je nach 50/60Hz-Flag neu laden
  761.         move.b    #4,TODDIV(a0)
  762.         bra    CiaBTODLoaded
  763. CiaBTOD60Hz    move.b    #5,TODDIV(a0)
  764.  
  765. CiaBTODLoaded    move    #0,ccr        ;X löschen
  766.         move.b    #1,d0        ;1/10 Sekunden erhöhen
  767.         move.b    TOD10THS(a0),d1
  768.         abcd    d0,d1
  769.         move.b    d1,TOD10THS(a0)
  770.         cmp.b    #$10,d1        ;Über 10?
  771.         blo    CiaBTODDone
  772.  
  773.         clr.b    TOD10THS(a0)    ;Ja, 1/10 Sekunden auf Null setzen
  774.         move    #0,ccr        ;und Sekunden erhöhen
  775.         move.b    #1,d0
  776.         move.b    TODSEC(a0),d1
  777.         abcd    d0,d1
  778.         move.b    d1,TODSEC(a0)
  779.         cmp.b    #$60,d1        ;Über 60?
  780.         blo    CiaBTODDone
  781.  
  782.         clr.b    TODSEC(a0)    ;Ja, Sekunden auf Null setzen
  783.         move    #0,ccr        ;und Minuten erhöhen
  784.         move.b    #1,d0
  785.         move.b    TODMIN(a0),d1
  786.         abcd    d0,d1
  787.         move.b    d1,TODMIN(a0)
  788.         cmp.b    #$60,d1        ;Über 60?
  789.         blo    CiaBTODDone
  790.  
  791.         clr.b    TODMIN(a0)    ;Ja, Minuten auf Null setzen
  792.         move    #0,ccr        ;und Stunden erhöhen
  793.         move.b    #1,d0
  794.         move.b    TODHR(a0),d1
  795.         and.b    #$1f,d1        ;AM/PM ausmaskieren
  796.         abcd    d0,d1
  797.         and.b    #$80,TODHR(a0)    ;Stunden schreiben, AM/PM lassen
  798.         or.b    d1,TODHR(a0)
  799.  
  800.         cmp.b    #$12,d1        ;Über 12?
  801.         blo    CiaBTODDone
  802.  
  803.         and.b    #$1f,TODHR(a0)    ;Ja, Stunden auf Null setzen
  804.         eor.b    #$80,TODHR(a0)    ;und AM/PM umdrehen
  805.  
  806. CiaBTODDone    move.l    TOD10THS(a0),d0    ;Alarmzeit erreicht?
  807.         cmp.l    ALM10THS(a0),d0
  808.         bne    CiaBTODNop
  809.         move.b    ICR(a0),d0    ;Ja, IRQ-Bit setzen
  810.         or.b    #$04,d0
  811.         btst    #2,INTMASK(a0)    ;IRQ freigegeben?
  812.         beq    CiaBTODNoIRQ
  813.         or.b    #$80,d0        ;Ja, IR-Bit setzen
  814.         st.b    IntIsNMI    ;und NMI auslösen
  815. CiaBTODNoIRQ    move.b    d0,ICR(a0)
  816. CiaBTODNop
  817.  
  818. *
  819. * Joystickabfrage
  820. *
  821.  
  822.         lea    Registers1,a0
  823.  
  824. ; Port 1
  825.         move.b    #$ff,d2        ;Vorgabe: Joystick inaktiv
  826.         tst.w    Joystick1On(pc)
  827.         beq    15$
  828.  
  829.         btst    #6,$bfe001    ;Feuerknopf
  830.         bne    11$
  831.         bclr    #4,d2
  832.  
  833. 11$        move.w    $dff00a,d0
  834.         btst    #1,d0        ;Rechts
  835.         beq    12$
  836.         bclr    #3,d2
  837.  
  838. 12$        btst    #9,d0        ;Links
  839.         beq    13$
  840.         bclr    #2,d2
  841.  
  842. 13$        move.w    d0,d1
  843.         add.w    d0,d0
  844.         eor.w    d1,d0
  845.         btst    #1,d0        ;Runter
  846.         beq    14$
  847.         bclr    #1,d2
  848.  
  849. 14$        btst    #9,d0        ;Hoch
  850.         beq    15$
  851.         bclr    #0,d2
  852.  
  853. 15$        move.b    d2,Joystick1
  854.  
  855. ; Port 2
  856.         move.b    Joystick2Key,d2    ;Vorgabe: Zehnerblock-Emulation
  857.         tst.w    Joystick2On(pc)
  858.         beq    25$
  859.  
  860.         btst    #7,$bfe001    ;Feuerknopf
  861.         bne    21$
  862.         bclr    #4,d2
  863.  
  864. 21$        move.w    $dff00c,d0
  865.         btst    #1,d0        ;Rechts
  866.         beq    22$
  867.         bclr    #3,d2
  868.  
  869. 22$        btst    #9,d0        ;Links
  870.         beq    23$
  871.         bclr    #2,d2
  872.  
  873. 23$        move.w    d0,d1
  874.         add.w    d0,d0
  875.         eor.w    d1,d0
  876.         btst    #1,d0        ;Runter
  877.         beq    24$
  878.         bclr    #1,d2
  879.  
  880. 24$        btst    #9,d0        ;Hoch
  881.         beq    25$
  882.         bclr    #0,d2
  883.  
  884. 25$        move.b    d2,Joystick2
  885.  
  886. ; Joysticks vertauschen?
  887.         tst.w    JoystickSwap(pc)
  888.         beq    30$
  889.         move.b    Joystick1,d0
  890.         move.b    Joystick2,Joystick1
  891.         move.b    d0,Joystick2
  892. 30$        rts
  893.  
  894.  
  895. **
  896. ** Taste wurde gedrückt
  897. ** d0.b: RawKey-Code
  898. **
  899.  
  900. KeyPressed    lea    KeyMatrix,a0
  901.  
  902.         bclr    #7,d0                ;KeyUp/KeyDown
  903.         bne    KeyUp
  904.  
  905.         cmp.b    #$40,d0
  906.         bhs    KeyDownSpecial
  907.         and.w    #$003f,d0            ;$00..$3f
  908.  
  909.         cmp.b    #$0f,d0                ;Joystick-Emulation
  910.         beq    KeyDownJoyFire
  911.         cmp.b    #$1d,d0
  912.         beq    KeyDownJoyDL
  913.         cmp.b    #$1e,d0
  914.         beq    KeyDownJoyDown
  915.         cmp.b    #$1f,d0
  916.         beq    KeyDownJoyDR
  917.         cmp.b    #$2d,d0
  918.         beq    KeyDownJoyLeft
  919.         cmp.b    #$2e,d0
  920.         beq    KeyDownJoyFire
  921.         cmp.b    #$2f,d0
  922.         beq    KeyDownJoyRight
  923.         cmp.b    #$3d,d0
  924.         beq    KeyDownJoyUL
  925.         cmp.b    #$3e,d0
  926.         beq    KeyDownJoyUp
  927.         cmp.b    #$3f,d0
  928.         beq    KeyDownJoyUR
  929.  
  930.         movem.w    KeyTable(pc,d0.w*4),d0/d1
  931.         bclr    d1,(a0,d0.w)
  932.         rts
  933.  
  934. KeyUp        cmp.b    #$40,d0
  935.         bhs    KeyUpSpecial
  936.         and.w    #$003f,d0            ;$00..$3f
  937.  
  938.         cmp.b    #$0f,d0                ;Joystick-Emulation
  939.         beq    KeyUpJoyFire
  940.         cmp.b    #$1d,d0
  941.         beq    KeyUpJoyDL
  942.         cmp.b    #$1e,d0
  943.         beq    KeyUpJoyDown
  944.         cmp.b    #$1f,d0
  945.         beq    KeyUpJoyDR
  946.         cmp.b    #$2d,d0
  947.         beq    KeyUpJoyLeft
  948.         cmp.b    #$2e,d0
  949.         beq    KeyUpJoyFire
  950.         cmp.b    #$2f,d0
  951.         beq    KeyUpJoyRight
  952.         cmp.b    #$3d,d0
  953.         beq    KeyUpJoyUL
  954.         cmp.b    #$3e,d0
  955.         beq    KeyUpJoyUp
  956.         cmp.b    #$3f,d0
  957.         beq    KeyUpJoyUR
  958.  
  959.         movem.w    KeyTable(pc,d0.w*4),d0/d1
  960.         bset    d1,(a0,d0.w)
  961. KeyNOP        rts
  962.  
  963. KeyDownSpecial    sub.b    #$40,d0
  964.         cmp.b    #$20,d0
  965.         bhs    KeyDownMod
  966.         and.w    #$1f,d0                ;$40..$5f
  967.         jmp    ([KeyDownSpecTab,pc,d0.w*4])
  968.  
  969. KeyDownMod    sub.b    #$20,d0
  970.         cmp.b    #$08,d0
  971.         bhs    KeyNOP
  972.         and.w    #$07,d0                ;$60..$67
  973.         movem.w    KeyModTable(pc,d0.w*4),d0/d1
  974.         bclr    d1,(a0,d0.w)
  975.         rts
  976.  
  977. KeyUpSpecial    sub.b    #$40,d0
  978.         cmp.b    #$20,d0
  979.         bhs    KeyUpMod
  980.         and.w    #$1f,d0                ;$40..$5f
  981.         jmp    ([KeyUpSpecTab,pc,d0.w*4])
  982.  
  983. KeyUpMod    sub.b    #$20,d0
  984.         cmp.b    #$08,d0
  985.         bhs    KeyNOP
  986.         and.w    #$07,d0                ;$60..$67
  987.         movem.w    KeyModTable(pc,d0.w*4),d0/d1
  988.         bset    d1,(a0,d0.w)
  989.         rts
  990.  
  991. KeySpaceD    bclr    #4,7(a0)
  992.         rts
  993. KeySpaceU    bset    #4,7(a0)
  994.         rts
  995. KeyBackD    bclr    #0,(a0)
  996.         rts
  997. KeyBackU    bset    #0,(a0)
  998.         rts
  999. KeyEnterD
  1000. KeyReturnD    bclr    #1,(a0)
  1001.         rts
  1002. KeyEnterU
  1003. KeyReturnU    bset    #1,(a0)
  1004.         rts
  1005. KeyEscD        bclr    #7,7(a0)
  1006.         rts
  1007. KeyEscU        bset    #7,7(a0)
  1008.         rts
  1009. KeyDeleteD    bclr    #3,6(a0)
  1010.         rts
  1011. KeyDeleteU    bset    #3,6(a0)
  1012.         rts
  1013. KeyUpD        bclr    #4,6(a0)
  1014.         bclr    #7,(a0)
  1015.         rts
  1016. KeyUpU        bset    #4,6(a0)
  1017.         bset    #7,(a0)
  1018.         rts
  1019. KeyDownD    bclr    #7,(a0)
  1020.         rts
  1021. KeyDownU    bset    #7,(a0)
  1022.         rts
  1023. KeyRightD    bclr    #2,(a0)
  1024.         rts
  1025. KeyRightU    bset    #2,(a0)
  1026.         rts
  1027. KeyLeftD    bclr    #4,6(a0)
  1028.         bclr    #2,(a0)
  1029.         rts
  1030. KeyLeftU    bset    #4,6(a0)
  1031.         bset    #2,(a0)
  1032.         rts
  1033. KeyF1D        bclr    #4,(a0)
  1034.         rts
  1035. KeyF1U        bset    #4,(a0)
  1036.         rts
  1037. KeyF3D        bclr    #5,(a0)
  1038.         rts
  1039. KeyF3U        bset    #5,(a0)
  1040.         rts
  1041. KeyF5D        bclr    #6,(a0)
  1042.         rts
  1043. KeyF5U        bset    #6,(a0)
  1044.         rts
  1045. KeyF7D        bclr    #3,(a0)
  1046.         rts
  1047. KeyF7U        bset    #3,(a0)
  1048.         rts
  1049. KeyF2D        bclr    #4,6(a0)
  1050.         bclr    #4,(a0)
  1051.         rts
  1052. KeyF2U        bset    #4,6(a0)
  1053.         bset    #4,(a0)
  1054.         rts
  1055. KeyF4D        bclr    #4,6(a0)
  1056.         bclr    #5,(a0)
  1057.         rts
  1058. KeyF4U        bset    #4,6(a0)
  1059.         bset    #5,(a0)
  1060.         rts
  1061. KeyF6D        bclr    #4,6(a0)
  1062.         bclr    #6,(a0)
  1063.         rts
  1064. KeyF6U        bset    #4,6(a0)
  1065.         bset    #6,(a0)
  1066.         rts
  1067. KeyF8D        bclr    #4,6(a0)
  1068.         bclr    #3,(a0)
  1069.         rts
  1070. KeyF8U        bset    #4,6(a0)
  1071.         bset    #3,(a0)
  1072.         rts
  1073. KeyF9D        jmp    ShowPrefs    ;Prefs-Fenster zeigen
  1074. KeyF10D        st.b    IntIsRESET    ;6510-Reset
  1075.         bsr    Reset6526
  1076.         bra    Reset6581
  1077. KeyNKPlusD    bclr    #0,5(a0)    ;+
  1078.         rts
  1079. KeyNKPlusU    bset    #0,5(a0)
  1080.         rts
  1081. KeyNKMinusD    bclr    #3,5(a0)    ;-
  1082.         rts
  1083. KeyNKMinusU    bset    #3,5(a0)
  1084.         rts
  1085. KeyNKAsterD    tst.w    KeyboardYZ
  1086.         bne    1$
  1087.         bclr    #1,6(a0)    ;*
  1088.         rts
  1089. 1$        bclr    #5,6(a0)    ;=
  1090.         rts
  1091. KeyNKAsterU    tst.w    KeyboardYZ
  1092.         bne    1$
  1093.         bset    #1,6(a0)
  1094.         rts
  1095. 1$        bset    #5,6(a0)
  1096.         rts
  1097. KeyNKSlashD    tst.w    KeyboardYZ
  1098.         bne    1$
  1099.         bclr    #7,6(a0)    ;/
  1100.         rts
  1101. 1$        bclr    #6,6(a0)    ;^
  1102.         rts
  1103. KeyNKSlashU    tst.w    KeyboardYZ
  1104.         bne    1$
  1105.         bset    #7,6(a0)
  1106.         rts
  1107. 1$        bset    #6,6(a0)
  1108.         rts
  1109. KeyNKLeftParD    bclr    #4,6(a0)    ;[
  1110.         bclr    #5,5(a0)
  1111.         rts
  1112. KeyNKLeftParU    bset    #4,6(a0)
  1113.         bset    #5,5(a0)
  1114.         rts
  1115. KeyNKRightParD    bclr    #4,6(a0)    ;]
  1116.         bclr    #2,6(a0)
  1117.         rts
  1118. KeyNKRightParU    bset    #4,6(a0)
  1119.         bset    #2,6(a0)
  1120.         rts
  1121. KeyHelpD    st.b    IntIsNMI    ;NMI auslösen
  1122.         rts
  1123.  
  1124. ; Joystick-Emulation
  1125. KeyDownJoyUp    bclr    #0,Joystick2Key
  1126.         rts
  1127. KeyDownJoyDown    bclr    #1,Joystick2Key
  1128.         rts
  1129. KeyDownJoyLeft    bclr    #2,Joystick2Key
  1130.         rts
  1131. KeyDownJoyRight    bclr    #3,Joystick2Key
  1132.         rts
  1133. KeyDownJoyUL    bclr    #0,Joystick2Key
  1134.         bclr    #2,Joystick2Key
  1135.         rts
  1136. KeyDownJoyUR    bclr    #0,Joystick2Key
  1137.         bclr    #3,Joystick2Key
  1138.         rts
  1139. KeyDownJoyDL    bclr    #1,Joystick2Key
  1140.         bclr    #2,Joystick2Key
  1141.         rts
  1142. KeyDownJoyDR    bclr    #1,Joystick2Key
  1143.         bclr    #3,Joystick2Key
  1144.         rts
  1145. KeyDownJoyFire    bclr    #4,Joystick2Key
  1146.         rts
  1147.  
  1148. KeyUpJoyUp    bset    #0,Joystick2Key
  1149.         rts
  1150. KeyUpJoyDown    bset    #1,Joystick2Key
  1151.         rts
  1152. KeyUpJoyLeft    bset    #2,Joystick2Key
  1153.         rts
  1154. KeyUpJoyRight    bset    #3,Joystick2Key
  1155.         rts
  1156. KeyUpJoyUL    bset    #0,Joystick2Key
  1157.         bset    #2,Joystick2Key
  1158.         rts
  1159. KeyUpJoyUR    bset    #0,Joystick2Key
  1160.         bset    #3,Joystick2Key
  1161.         rts
  1162. KeyUpJoyDL    bset    #1,Joystick2Key
  1163.         bset    #2,Joystick2Key
  1164.         rts
  1165. KeyUpJoyDR    bset    #1,Joystick2Key
  1166.         bset    #3,Joystick2Key
  1167.         rts
  1168. KeyUpJoyFire    bset    #4,Joystick2Key
  1169.         rts
  1170.  
  1171.  
  1172. **
  1173. ** Datenbereich
  1174. **
  1175.  
  1176.         CNOP    0,4
  1177. Registers1    ds.b    32    ;CIA-A-Register
  1178. Registers2    ds.b    32    ;CIA-B-Register
  1179.  
  1180. CIACycles    dc.w    0    ;Anzahl Phi2-Zyklen pro Rasterzeile (für Timer)
  1181. Joystick1On    dc.w    0    ;Joystick an Port 1 wird abgefragt
  1182. Joystick2On    dc.w    0    ;Joystick an Port 2 wird abgefragt
  1183. JoystickSwap    dc.w    0    ;Joysticks vertauschen
  1184. KeyboardYZ    dc.w    0    ;Amerikanische Tastaturbelegung
  1185.  
  1186. Joystick1    dc.b    0    ;Joystick 1 AND-Wert
  1187. Joystick2    dc.b    0    ;Joystick 2 AND-Wert
  1188. Joystick2Key    dc.b    0    ;Joystick 2 AND-Wert für Emulation über Zehnerblock
  1189.  
  1190. ; Tastaturübersetzungstabelle:
  1191. ; Für jeden Amiga-RawKey Spalte und Zeile in der KeyMatrix
  1192.         CNOP    0,4
  1193. KeyTable    dc.w    7,1    ;` -> <-
  1194.         dc.w    7,0    ;1
  1195.         dc.w    7,3    ;2
  1196.         dc.w    1,0    ;3
  1197.         dc.w    1,3    ;4
  1198.         dc.w    2,0    ;5
  1199.         dc.w    2,3    ;6
  1200.         dc.w    3,0    ;7
  1201.         dc.w    3,3    ;8
  1202.         dc.w    4,0    ;9
  1203.         dc.w    4,3    ;0
  1204.         dc.w    5,0    ;ß -> +
  1205.         dc.w    5,3    ;´ -> -
  1206.         dc.w    6,0    ;\ -> £
  1207.         dc.w    0,0
  1208.         dc.w    4,3    ;NP 0
  1209.  
  1210.         dc.w    7,6    ;Q
  1211.         dc.w    1,1    ;W
  1212.         dc.w    1,6    ;E
  1213.         dc.w    2,1    ;R
  1214.         dc.w    2,6    ;T
  1215. KeyPatch1    dc.w    1,4    ;Y -> Z
  1216.         dc.w    3,6    ;U
  1217.         dc.w    4,1    ;I
  1218.         dc.w    4,6    ;O
  1219.         dc.w    5,1    ;P
  1220.         dc.w    5,6    ;ü -> @
  1221.         dc.w    6,1    ;+ -> *
  1222.         dc.w    0,0
  1223.         dc.w    7,0    ;NP 1
  1224.         dc.w    7,3    ;NP 2
  1225.         dc.w    1,0    ;NP 3
  1226.  
  1227.         dc.w    1,2    ;A
  1228.         dc.w    1,5    ;S
  1229.         dc.w    2,2    ;D
  1230.         dc.w    2,5    ;F
  1231.         dc.w    3,2    ;G
  1232.         dc.w    3,5    ;H
  1233.         dc.w    4,2    ;J
  1234.         dc.w    4,5    ;K
  1235.         dc.w    5,2    ;L
  1236.         dc.w    5,5    ;ö -> :
  1237.         dc.w    6,2    ;ä -> ;
  1238.         dc.w    6,5    ;# -> =
  1239.         dc.w    0,0
  1240.         dc.w    1,3    ;NP 4
  1241.         dc.w    2,0    ;NP 5
  1242.         dc.w    2,3    ;NP 6
  1243.  
  1244.         dc.w    6,6    ;< -> ^
  1245. KeyPatch2    dc.w    3,1    ;Z -> Y
  1246.         dc.w    2,7    ;X
  1247.         dc.w    2,4    ;C
  1248.         dc.w    3,7    ;V
  1249.         dc.w    3,4    ;B
  1250.         dc.w    4,7    ;N
  1251.         dc.w    4,4    ;M
  1252.         dc.w    5,7    ;,
  1253.         dc.w    5,4    ;.
  1254.         dc.w    6,7    ;- -> /
  1255.         dc.w    0,0
  1256.         dc.w    5,4    ;NP .
  1257.         dc.w    3,0    ;NP 7
  1258.         dc.w    3,3    ;NP 8
  1259.         dc.w    4,0    ;NP 9
  1260.  
  1261. KeyDownSpecTab    dc.l    KeySpaceD
  1262.         dc.l    KeyBackD
  1263.         dc.l    KeyNOP
  1264.         dc.l    KeyEnterD
  1265.         dc.l    KeyReturnD
  1266.         dc.l    KeyEscD
  1267.         dc.l    KeyDeleteD
  1268.         dc.l    KeyNOP
  1269.  
  1270.         dc.l    KeyNOP
  1271.         dc.l    KeyNOP
  1272.         dc.l    KeyNKMinusD
  1273.         dc.l    KeyNOP
  1274.         dc.l    KeyUpD
  1275.         dc.l    KeyDownD
  1276.         dc.l    KeyRightD
  1277.         dc.l    KeyLeftD
  1278.  
  1279.         dc.l    KeyF1D
  1280.         dc.l    KeyF2D
  1281.         dc.l    KeyF3D
  1282.         dc.l    KeyF4D
  1283.         dc.l    KeyF5D
  1284.         dc.l    KeyF6D
  1285.         dc.l    KeyF7D
  1286.         dc.l    KeyF8D
  1287.  
  1288.         dc.l    KeyF9D
  1289.         dc.l    KeyF10D
  1290.         dc.l    KeyNKLeftParD
  1291.         dc.l    KeyNKRightParD
  1292.         dc.l    KeyNKSlashD
  1293.         dc.l    KeyNKAsterD
  1294.         dc.l    KeyNKPlusD
  1295.         dc.l    KeyHelpD
  1296.  
  1297. KeyUpSpecTab    dc.l    KeySpaceU
  1298.         dc.l    KeyBackU
  1299.         dc.l    KeyNOP
  1300.         dc.l    KeyEnterU
  1301.         dc.l    KeyReturnU
  1302.         dc.l    KeyEscU
  1303.         dc.l    KeyDeleteU
  1304.         dc.l    KeyNOP
  1305.  
  1306.         dc.l    KeyNOP
  1307.         dc.l    KeyNOP
  1308.         dc.l    KeyNKMinusU
  1309.         dc.l    KeyNOP
  1310.         dc.l    KeyUpU
  1311.         dc.l    KeyDownU
  1312.         dc.l    KeyRightU
  1313.         dc.l    KeyLeftU
  1314.  
  1315.         dc.l    KeyF1U
  1316.         dc.l    KeyF2U
  1317.         dc.l    KeyF3U
  1318.         dc.l    KeyF4U
  1319.         dc.l    KeyF5U
  1320.         dc.l    KeyF6U
  1321.         dc.l    KeyF7U
  1322.         dc.l    KeyF8U
  1323.  
  1324.         dc.l    KeyNOP
  1325.         dc.l    KeyNOP
  1326.         dc.l    KeyNKLeftParU
  1327.         dc.l    KeyNKRightParU
  1328.         dc.l    KeyNKSlashU
  1329.         dc.l    KeyNKAsterU
  1330.         dc.l    KeyNKPlusU
  1331.         dc.l    KeyNOP
  1332.  
  1333. KeyModTable    dc.w    1,7        ;Shift left
  1334.         dc.w    6,4        ;Shift right
  1335.         dc.w    1,7        ;Caps lock -> Shift left
  1336.         dc.w    7,2        ;Control
  1337.         dc.w    7,5        ;Alt left -> C=
  1338.         dc.w    7,5        ;Alt right -> C=
  1339.         dc.w    7,5        ;Amiga left -> C=
  1340.         dc.w    7,5        ;Amiga right -> C=
  1341.  
  1342. ; Bit  7   6   5   4   3   2   1   0
  1343. ; 0   CUD  F5  F3  F1  F7 CLR RET DEL
  1344. ; 1   SHL  E   S   Z   4   A   W   3
  1345. ; 2    X   T   F   C   6   D   R   5
  1346. ; 3    V   U   H   B   8   G   Y   7
  1347. ; 4    N   O   K   M   0   J   I   9
  1348. ; 5    ,   @   :   .   -   L   P   +
  1349. ; 6    /   ^   =  SHR HOM  ;   *   £
  1350. ; 7   R/S  Q   C= SPC  2  CTL  <-  1
  1351.  
  1352. KeyMatrix    ds.b    8    ;C64-Tastaturmatrix pro Taste ein Bit
  1353.                 ;0: Taste gedrückt
  1354.  
  1355.         END
  1356.